#ifndef LinkCommand_hpp
#define LinkCommand_hpp

#include <stdio.h>
#include "LinkBuffer.h"
#include "LinkCommon.h"

namespace HHLink {

/**
 * 查询ble固件版本
 * @return
 */
    LinkBuffer cmd_queryBleFirmwareVersion();
/**
 * 查询充电和云台状态
 * @return
 */
    LinkBuffer cmd_queryChargeAndGimbalStatus();
/**
 * 查询云台固件版本
 * @return
 */
    LinkBuffer cmd_queryGimbalFirmwareVersion();

/**
 * 读摇杆，响应，激活标志位,智能横滚
 * @return
 */
    LinkBuffer cmd_queryActivationFlag();

/**
 * 查询云台,机型,订单号
 * @return
 */
    LinkBuffer cmd_queryProductInfo();

/**
 * 读年份，日期，流水码
 * @return
 */
    LinkBuffer cmd_queryProductDate();

/**
 * 读取俯仰和航向跟随参数
 * @return
 */
    LinkBuffer cmd_queryFollowParameter();

/**
 * 归中
 * @return
 */
    LinkBuffer cmd_centering();

/**
 * 角度控制
 * @param panAngle 航向轴角度
 * @param panSpeed 航向轴速度
 * @param panEnable 航向轴是否转动
 * @param titlAngle 俯仰轴角度
 * @param titlSpeed 俯仰轴速度
 * @param titlEnable 俯仰轴是否转动
 * @param rollAngle
 * @param rollSpeed
 * @param rollEnable
 * @return
 */
    LinkBuffer cmd_angle_ctrl(int panAngle, int panSpeed, bool panEnable,
                              int tiltAngle, int tiltSpeed, bool tiltEnable,
                              int rollAngle = 0, int rollSpeed = 0, bool rollEnable = false);



/**
 * 速度控制
 * @param cmd Moment:0x67 追踪:0x64
 * @param pan 航向
 * @param tilt 俯仰
 * @param roll 横滚
 * @return
 */
    LinkBuffer cmd_speed_ctrl(unsigned char cmd, int pan, int tilt, int roll);

/**
 * 追踪控制1.0
 * @param pan 航向 [-510,510]
 * @param tilt 俯仰 [-510,510]
 * @return
 */
    LinkBuffer cmd_speed_ctrl_track(int pan, int tilt);

/**
 * 追踪控制2.0
 * @param pan 航向
 * @param tilt 俯仰
 * @param horizontalLength 水平长度
 * @param verticalLength 垂直长度
 * @return
 */
    LinkBuffer cmd_speed_ctrl_track(int pan, int tilt, int horizontalLength, int verticalLength);

/**
 * 进入延时摄影模式
 * @return
 */
    LinkBuffer cmd_timelapse_enter();
/**
 * 根据当前模式添加取景点
 * @param number 取景点编号
 * @return
 */
    LinkBuffer cmd_timelapse_add_point(int number);
/**
 * 删除最后一个取景点
 * @return
 */
    LinkBuffer cmd_timelapse_remove_last_point();
/**
 * 移动到起始位置
 * @param isPreview 是否预览模式
 * @param time 时间
 * @return
 */
    LinkBuffer cmd_timelapse_move_start_point(bool isPreview, int time);
/**
 * 延时摄影开始
 * @return
 */
    LinkBuffer cmd_timelapse_start();
/**
 * 停止延时摄影
 * @return
 */
    LinkBuffer cmd_timelapse_stop();

/**
 * 盗梦空间准备
 * @param speed 转动速度系数
 * @param time 转动时间
 * @return
 */
    LinkBuffer cmd_moment_inception_prepare(int speed, int time);

/**
 * 盗梦空间开始
 * @param speed
 * @param time
 * @return
 */
    LinkBuffer cmd_moment_inception_start(int speed, int time);

/**
 * 设置云台工作模式
 * @param mode 固定模式(0:PF 1:PTF 2:L 3:POV 4:自定义)
 * @param customMode see @LINK_GIMBAL_WORK_MODE_CUSTOM 工作模式设置自定义时才有效
 * @return
 */
    LinkBuffer cmd_set_gimbal_work_mode(LINK_GIMBAL_WORK_MODE mode, LINK_GIMBAL_WORK_MODE_CUSTOM customMode);

/**
 * 设置云台跟随速度&稳拍风格
 * @param mode 稳拍风格&跟随速度(0:柔顺&慢速，1：常规&中速，2：运动&快速，3：急度)
 * @return
 */
    LinkBuffer cmd_set_gimbal_follow_speed(int mode);

/**
 * 设置云台工作模式和跟随速度&稳拍风格
 * @param workMode 工作模式(0:PF 1:PTF 2:L 3:POV 4:自定义)
 * @param customWorkMode 自定义 see @LINK_GIMBAL_WORK_MODE_CUSTOM 工作模式设置自定义时才有效
 * @param followMode 稳拍风格&跟随速度(0:柔顺&慢速，1：常规&中速，2：运动&快速，3：急度)
 * @return
 */
    LinkBuffer cmd_set_gimbal_work_mode_and_follow_speed(LINK_GIMBAL_WORK_MODE workMode, LINK_GIMBAL_WORK_MODE_CUSTOM customWorkMode, int followMode);

/**
 * 设置云台电机力度，不支持自定义电机力度设置
 * @param force see @LINK_GIMBAL_MOTOR_FORCE
 * @return
 */
    LinkBuffer cmd_set_motor_force(LINK_GIMBAL_MOTOR_FORCE force);

/**
 * 设置云台电机力度，不支持自定义电机力度设置
 * @param force see @LINK_GIMBAL_MOTOR_FORCE
 * @param normalMode
 * @param sceneMode
 * @param turnScreen
 * @return
 */
    LinkBuffer cmd_set_motor_force(LINK_GIMBAL_MOTOR_FORCE force, int normalMode, int sceneMode, int turnScreen);

/**
 * 设置云台自定义电机力度-航向轴
 * @param value
 * @return
 */
    LinkBuffer cmd_set_motor_force_pan(int value);

/**
 * 设置云台自定义电机力度-俯仰轴
 * @param value
 * @return
 */
    LinkBuffer cmd_set_motor_force_tilt(int value);

/**
 * 设置云台自定义电机力度-横滚轴
 * @param value
 * @return
 */
    LinkBuffer cmd_set_motor_force_roll(int value);

/**
 * 设置云台自定义电机力度-自适应
 * @param value
 * @return
 */
    LinkBuffer cmd_set_motor_force_self_adaptive();

/**
 * 设置云台自定义电机力度值，只支持自定义电机力度
 * @param panValue 航向值
 * @param tiltValue 俯仰值
 * @param rollValue 横滚值
 * @param normalMode
 * @param sceneMode
 * @param turnScreen
 * @return
 */
    LinkBuffer cmd_set_motor_force(int panValue, int tiltValue, int rollValue, int normalMode, int sceneMode, int turnScreen);

/**
 * 设置摇杆左右控制反向
 * @param reverse 0:关&正向 1:开&反向
 * @return
 */
    LinkBuffer cmd_set_rocker_pan_reverse(int reverse);

/**
 * 设置摇杆左右速度
 * @param speed
 * @return
 */
    LinkBuffer cmd_set_rocker_pan_speed(int speed);

/**
 * 设置摇杆上下控制反向
 * @param reverse 0:关&正向 1:开&反向
 * @return
 */
    LinkBuffer cmd_set_rocker_tilt_reverse(int reverse);

/**
 * 设置摇杆上下速度
 * @param speed
 * @return
 */
    LinkBuffer cmd_set_rocker_tilt_speed(int speed);

/**
 * 摇杆控制
 * @param pan_reverse 航向控制反向
 * @param pan_speed 航向速度
 * @param tilt_reverse 俯仰控制反向
 * @param tilt_speed 俯仰速度
 * @return
 */
    LinkBuffer cmd_set_rocker(int pan_reverse, int pan_speed, int tilt_reverse, int tilt_speed);

/**
 * 查询加速度计偏差值
 * @return
 */
    LinkBuffer cmd_get_gimbal_accelerometer_offset();

/**
 * 设置加速度计偏差值
 * @param roll 横滚轴偏差值
 * @param tilt 俯仰轴偏差值
 * @param v_roll 手掰竖屏横滚轴偏差值
 * @return
 */
    LinkBuffer cmd_set_gimbal_accelerometer_offset(float roll, float tilt, float v_roll);

/**
 * 设置编码器偏差值
 * @param tilt
 * @param roll
 * @param yaw
 * @return
 */
    LinkBuffer cmd_set_gimbal_encoder_offset(float tilt, float roll, float yaw);

/**
 * 查询编码器偏差值
 * @return
 */
    LinkBuffer cmd_get_gimbal_encoder_offset();

/**
 * 设置横滚轴微调
 * @param offset
 * @param bufferSize 返回的buffer数量
 * @return buffer数组，使用完需释放
 */
    LinkBuffer* cmd_set_gimbal_roll_offset(float offset, int *bufferSize);

/**
 * 设置航向轴微调
 * @param offset
 * @param bufferSize 返回的buffer数量
 * @return buffer数组，使用完需释放
 */
    LinkBuffer* cmd_set_gimbal_pan_offset(float offset, int *bufferSize);

/**
 * 设置俯仰轴微调
 * @param offset
 * @param bufferSize 返回的buffer数量
 * @return buffer数组，使用完需释放
 */
    LinkBuffer* cmd_set_gimbal_tilt_offset(float offset, int *bufferSize);

/**
 * 设置航向&俯仰&横滚轴微调
 * @param pan
 * @param tilt
 * @param roll
 * @param bufferSize 返回的buffer数量
 * @return buffer数组，使用完需释放
 */
    LinkBuffer* cmd_set_gimbal_pan_tilt_roll_offset(float pan, float tilt, float roll, int *bufferSize);

/**
 * 查询云台提示音状态
 * @return
 */
    LinkBuffer cmd_get_gimbal_tone();

/**
 * 设置云台静音状态
 * @param mode 0:静音 1:非静音
 * @return
 */
    LinkBuffer cmd_set_gimbal_tone_mode(int mode);

/**
 * 设置云台偏好设置
 * @param bootDirection 开机方向
 * @param screenOrientation 屏幕朝向
 * @param recordScreenState 关机是否记录横竖屏状态
 * @param recordWorkMode 关机是否记录工作模式
 * @return
 */
    LinkBuffer cmd_set_gimbal_preferences(int bootDirection, int screenOrientation, int recordScreenState, int recordWorkMode);

/**
 * 设置云台开机方向
 * @param bootDirection 0：正常开机（AI 朝下） 1：顺时针 90 度开机（AI 朝左） 2：顺时针 180 度开机（AI 朝上） 3：顺时针 270 度开机（AI 朝右） 4：不设置开机角度
 * @return
 */
    LinkBuffer cmd_set_gimbal_bootDirection(int bootDirection);

/**
 * 查询云台开机方向
 * @return
 */
    LinkBuffer cmd_get_gimbal_bootDirection();

/**
 * 查询A/B点时长(单位秒)
 * @return
 */
    LinkBuffer cmd_get_gimbal_AB_duration_s();

/**
 * 查询A/B点时长(单位分)
 * @return
 */
    LinkBuffer cmd_get_gimbal_AB_duration_min();

/**
 * 设置A/B点移动时长(分)
 * @param duration_sec 时长，单位秒
 * @return
 */
    LinkBuffer cmd_set_gimbal_AB_duration_min(int duration_min);

/**
 * 设置A/B点移动时长(秒)
 * @param duration_sec 时长，单位秒
 * @return
 */
    LinkBuffer cmd_set_gimbal_AB_duration_sec(int duration_sec);

/**
 * 查询盗梦空间速度和时间
 * @return
 */
    LinkBuffer cmd_get_gimbal_inception_speed_and_time();

/**
 * 设置盗梦空空速度和时间
 * @param speed 范围[1,100]
 * @param time 传-1，表示不改变当前时间
 * @return
 */
    LinkBuffer cmd_set_gimbal_inception_speed_and_time(int speed, int time = -1);

/**
 * 校准云台
 * @return
 */
    LinkBuffer cmd_set_gimbal_calibrate();

/**
 * 恢复AI出厂设置
 * @return
 */
    LinkBuffer cmd_reset_gimbal_factory_AI();


}





#endif /* LinkCommand_hpp */
